class Node {  //定义一个节点类,作为链表的节点
    constructor(value,next = null) {
        this.value = value;
        this.next = next;
    }
}

class MyStackForLinkList { //通过链表实现栈的类
    constructor() {
        this.head = null; //头节点为空
        this._size = 0; //链表长度为0,设置成私有属性
    }

    push(element) { //push入栈操作
        const newNode = new Node(element);
        newNode.next = this.head; //新节点的next指向头节点,头节点初始化为空
        this.head = newNode; //将头节点指向新节点,新节点成为头节点
        this._size++; //链表长度加1
    }

    isEmpty() { //isEmpty判断栈是否为空操作
        return this._size === 0;
    }

    pop() { //pop出栈操作
        if (this.isEmpty()) return null;
        const value = this.head.value;
        this.head = this.head.next;
        this._size--;
        return value;
    }

    peek() { //peek访问栈顶元素操作
        if (this.isEmpty()) return null;
        return this.head.value;
    }

   //这里加上get可以直接通过myStackForLinkList.size来获取栈中元素个数,如果使用()则会报错
   get size() { //size获取栈中元素个数操作
        return this._size;
    }
}

//测试 
const myStackForLinkList = new MyStackForLinkList();
console.log(myStackForLinkList.isEmpty());
myStackForLinkList.push(1);
myStackForLinkList.push(2);
myStackForLinkList.push(3);
console.log(myStackForLinkList.peek());
console.log(myStackForLinkList.pop());
console.log(myStackForLinkList.isEmpty());
console.log(myStackForLinkList.size);
// console.log(myStackForLinkList.size);